
package com.zhike.service.file;

import java.io.File;
import java.util.HashMap;
import java.util.Set;
import java.util.HashSet;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import com.eva.epc.common.util.CommonUtils;
import com.eva.epc.common.util.se.ImgEqualScaleAndCutHelper;

import lombok.extern.slf4j.Slf4j;

import com.zhike.common.conf.IMBaseConf;
import com.zhike.common.constant.Constants;
import com.zhike.mapper.user.UsersBinaryMapper;

/**
 * 我的相册中的图片文件上传处理实现类。
 * 
 * @author Json
 * @sin 2.0
 */
@Slf4j
@Component
public class MyPhotoUploder extends UploaderRoot {
  @Resource
  private UsersBinaryMapper usersBinaryMapper;

  @Resource
  private IMBaseConf baseConf;

  @Override
  public String getFileSaveDir() {
    return baseConf.getDIR_USER_UPLOAD();
  }

  @Override
  public void onUploadSucess(HashMap<String, Object> parametersFromClient) throws Exception {
    String userUid = (String) parametersFromClient.get("user_uid");
    // 因为服务端是支持多文件上传的API，所以客户端单独把文件名带过来了，方便使用！
    String fileName = (String) parametersFromClient.get("file_name");
    // // 客户端传过来的token，用于请求的合法性检查，当前未作强制检查，留作以后使用
    // String token = (String)parametersFromClient.get("token");

    log.debug("[" + getDebugTAG() + "] 用户" + userUid + "的照片文件" + fileName + "数据上传成功，马上处理其它业务逻辑...");

    // 客户端传过来的数据（参数）的合法性检查
    if (userUid != null && fileName != null) {
      String uploadPath = getFileSaveDir();
      // 图片文件已经保存到的磁盘绝对路径
      File filePath = new File(uploadPath + File.separator + fileName);

      if (filePath.exists()) {
        // 生成原图的缩略图并存到磁盘
        File thumbnailFilePath = new File(uploadPath + File.separator + "th_" + fileName);
        // 如果该md5文件名命名（其实此md5码就是文件数据的指纹）存在，即意味着不需要写入磁盘了
        if (!thumbnailFilePath.exists()) {
          // 如果是照片则启用新的等经缩放并裁切的算法（此算法自2014-03-29实施），算法将保证缩略图的生成不变形
          try {
            ImgEqualScaleAndCutHelper.saveImageAsJpg(filePath.getAbsolutePath(), thumbnailFilePath.getAbsolutePath(),
                245, 245 // 生成的缩略图参考QQ空间的按245*245的极限缩放
            );
          } catch (Exception e) {
            log.warn("[" + getDebugTAG() + "] 图片缩略图生成（新算法不可靠，需优化？）出错了！", e);
          }
        }

        // 如果上传的是用户照片，则同时要插入一条数据到db中
        usersBinaryMapper.insertUsersBinary(userUid, "0", fileName,
            CommonUtils.getConvenientFileSize(filePath.length(), 2), filePath.length());
      } else {
        log.error("[" + getDebugTAG() + "] 用户" + userUid + "的照片文件" + fileName + "为何不存在？(绝对路径="
            + filePath.getAbsolutePath() + ")");
      }
    } else {
      throw new Exception("[" + getDebugTAG() + "] 无效的参数：userUid=" + userUid + ", fileName=" + fileName + ".");
    }
  }

  @Override
  public void onUploadFailure(Exception ex) {
    log.error("[" + getDebugTAG() + "] 处理照片上传时出错了，" + ex.getMessage(), ex);
  }

  @Override
  public String getDebugTAG() {
    return "HTTP照片上传";
  }

  @Override
  public String getPathTag() {
    return Constants.UPLOAD_USER + "/photo";
  }

  @Override
  public Set<String> getDetectedTypes() {
    Set<String> allowExtensions = new HashSet<>();
    allowExtensions.add("image/png");
    allowExtensions.add("image/jpeg");
    allowExtensions.add("image/jpg");
    allowExtensions.add("image/gif");
    return allowExtensions;
  }
}
